Skip to content

NestJS:RBAC 权限管理(实现思路)

模型层级

常见三张核心表(命名依项目而定):

实体说明
用户(User)账号、密码哈希、基础资料
角色(Role)角色编码、名称、是否超级管理员等
权限(Permission)菜单 / 按钮 / API 标识(如 user:create

多对多关系:用户 ↔ 角色角色 ↔ 权限;登录后签发 JWT,载荷中带 userId 或可还原的角色 / 权限列表(过大时可只带用户 ID,每次请求再查缓存)。

NestJS 落地要点

  1. 鉴权@nestjs/passport + passport-jwt 校验 Token。
  2. 鉴权与路由绑定:全局 Guard 或控制器级 @UseGuards(JwtAuthGuard)
  3. 授权:自定义 Guard 或装饰器(如 @Roles('admin')),读取 Handler 元数据,与用户权限比对。
  4. 注销 / 黑名单:登出将 jti / tokenId 写入 Redis 并设置 TTL,与 JWT 有效期一致;校验时查黑名单。

前端配合

  • 登录后保存 Token(内存 + 持久化策略按安全等级选择)。
  • 菜单与路由由后端权限列表生成,避免前端写死超级管理员菜单。
  • 按钮级权限:指令或组件根据 permissions 判断是否渲染。

安全提示

密码使用 bcrypt 等慢哈希;敏感接口务必 HTTPS;权限字符串需防枚举与越权(服务端最终以数据库为准)。